
//编程实现字符串的反转

#include<iostream>
#include<cstring>
#include <string>
using namespace std;

/**
    I am a student

    反转为：tudent a am I

    //第一步：将整个字符串反转，简单的首尾交换即可，reverseStr(char *str,int begin,int end)
    tneduts a ma I
    //第二步：将单个单词反转。只需要找到每个单词的begin和end位置，调用reverseStr函数即可。
        1. start=end
        2. 当str[end]!=' ' ,end++
        3. 调用函数reverse(str,start,end-1)
        4. 重复执行上述三部，直到end>=len为止。
*/

//反转字符串函数
int reverseStr(char *str,int s_begin,int s_end)  //str = str[] 类型，指针不能使用[]运算符
{
    /**
        1. 交换str[begin],str[end]
        2. begin++,end--,重复调用1
    */
    //cout<<"begin="<<s_begin<<",end="<<s_end<<endl;
    //参数合法性检测
    if(str==NULL)
    {
        return 0;
    }
    //交换首尾
    while(s_begin<s_end)
    {
        char tmp = str[s_begin];
        str[s_begin]=str[s_end];
        str[s_end]=tmp;
        s_begin++;
        s_end--;
    }
    return 1;
}

//实现字符串的反转
int reverseWord(char *str)
{
    int w_begin=0,w_end=0;
    //参数合法性检查
    if(str==NULL || *str=='\0')
    {
        return 0;
    }
    //首先将整个字符串反转
    int len = strlen(str);
    reverseStr(str,0,len-1);

    //将每个单词反转
    /*
        //第二步：将单个单词反转。只需要找到每个单词的begin和end位置，调用reverseStr函数即可。
        1. start=end
        2. 当str[end]!=' ' ,end++
        3. 调用函数reverse(str,start,end-1)
        4. 重复执行上述三部，直到end>=len为止。
    */
    while(w_end<len)
    {
        if(str[w_end]!=' ') //如果不是空格，则是一个单词的首字母
        {
            w_begin=w_end;  //单词开始位置

            //找到w_end
            while(str[w_end]!='\0'&&str[w_end]!=' '&&w_end<len)
            {
                w_end++;  //单词结束位置是w_end-1
            }
            //反转单词
            reverseStr(str,w_begin,w_end-1);
        }else
        {
            //如果w_end是空格，就跳过
            w_end++;
        }
    }
    cout<<"整个字符串反转："<<str<<endl;
}
int main()
{
    //测试reverseStr
    //char  str[] = "I am a student";
    cout<<"输入一行字符串,回车结束"<<endl;
    string input;
    getline(cin,input);
    char str[input.length()+1];
    for(int i = 0;i<input.length();i++)
    {
        str[i] = input[i];
    }
    str[input.length()] = '\0';
    reverseWord(str);
    system("pause");
    return 0;
}
